﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.IO;
using System.Windows.Threading;


namespace covjece
{
    public partial class MainWindow : Window
    {
        private Aplikacija app;
        public static List<int> obicnaPolja;
        public static List<int> pocetnaPolja;
        public static List<int> krajnjaPolja;
        public static List<bijeliKrug> bijeliKrugovi;


        public MainWindow()
        {
            InitializeComponent();

            obicnaPolja = new List<int>() { 0, 4, 1, 4, 2, 4, 3, 4, 4, 4, 4, 3, 4, 2, 4, 1, 4, 0, 5, 0, 6, 0, 6, 1, 6, 2, 
                                            6, 3, 6, 4, 7, 4, 8, 4, 9, 4, 10, 4, 10, 5, 10, 6, 9, 6, 8, 6, 7, 6, 6, 6, 6, 
                                            7, 6, 8, 6, 9, 6, 10, 5, 10, 4, 10, 4, 9, 4, 8, 4, 7, 4, 6, 3, 6, 2, 6, 1, 6, 
                                            0, 6, 0, 5 };


            pocetnaPolja = new List<int>() { 1, 1, 2, 1, 1, 2, 2, 2,
                                             8, 1, 9, 1, 8, 2, 9, 2,
                                             8, 8, 9, 8, 8, 9, 9, 9,
                                             1, 8, 2, 8, 1, 9, 2, 9 };

            //kako se i ulazi
            krajnjaPolja = new List<int>() { 1, 5, 2, 5, 3, 5, 4, 5,
                                              5, 1, 5, 2, 5, 3, 5, 4,
                                              9, 5, 8, 5, 7, 5, 6, 5,
                                              5, 9, 5, 8, 5, 7, 5, 6};

            iscrtajPolja();

        }


        public void osvjeziBroj(int i)
        {
            Dispatcher.BeginInvoke(new Action(() =>
            {
                sb1.Opacity = 0;
                sb2.Opacity = 0;
                sb3.Opacity = 0;
                sb4.Opacity = 0;
                sb5.Opacity = 0;
                sb6.Opacity = 0;
                sb7.Opacity = 0;

                if (i == 0) sb7.Opacity = 100;
                else if (i == 1)
                    sb1.Opacity = 100;
                else if (i == 2)
                    sb2.Opacity = 100;
                else if (i == 3)
                    sb3.Opacity = 100;
                else if (i == 4)
                    sb4.Opacity = 100;
                else if (i == 5)
                    sb5.Opacity = 100;
                else if (i == 6)
                    sb6.Opacity = 100;
            }), DispatcherPriority.Background);
        }

        public void staviNaObicnoPolje(UserControl o, int i)
        {

            Dispatcher.BeginInvoke(new Action(() =>
            {
                int x = 2 * i;
                int y = 2 * i + 1;
                if (mreza.Children.Cast<UIElement>().Count(e => Grid.GetRow(e) == obicnaPolja[y] && Grid.GetColumn(e) == obicnaPolja[x]) == 2)
                {
                    UserControl dupli = mreza.Children.Cast<UIElement>().Last(e => Grid.GetRow(e) == obicnaPolja[y] && Grid.GetColumn(e) == obicnaPolja[x]) as UserControl;


                    if (dupli is crveniKrug && !(o is crveniKrug))
                    {
                        CrveniIgrac.piunaUIgri--;
                        staviNaPocetno(dupli, (dupli as crveniKrug).pozicijaUKuci);
                        (dupli as crveniKrug).pozicija = -1;
                        (dupli as crveniKrug).aktivan = false;
                        (dupli as crveniKrug)._upravljanje.postaviStanje(new Cekaj());
                        (dupli as crveniKrug).prosaoPola = false;
                        app.crveni.dodajPiuna(ref dupli);
                    }
                    else if (dupli is plaviKrug && !(o is plaviKrug))
                    {
                        PlaviIgrac.piunaUIgri--;
                        staviNaPocetno(dupli, (dupli as plaviKrug).pozicijaUKuci);
                        (dupli as plaviKrug).pozicija = -1;
                        (dupli as plaviKrug).aktivan = false;
                        (dupli as plaviKrug)._upravljanje.postaviStanje(new Cekaj());
                        (dupli as plaviKrug).prosaoPola = false;
                        app.plavi.dodajPiuna(ref dupli);
                    }
                    else if (dupli is zeleniKrug && !(o is zeleniKrug))
                    {
                        ZeleniIgrac.piunaUIgri--;
                        staviNaPocetno(dupli, (dupli as zeleniKrug).pozicijaUKuci);
                        (dupli as zeleniKrug).pozicija = -1;
                        (dupli as zeleniKrug).aktivan = false;
                        (dupli as zeleniKrug)._upravljanje.postaviStanje(new Cekaj());
                        (dupli as zeleniKrug).prosaoPola = false;
                        app.zeleni.dodajPiuna(ref dupli);
                    }
                    else if (dupli is zutiKrug && !(o is zutiKrug))
                    {
                        ZutiIgrac.piunaUIgri--;
                        staviNaPocetno(dupli, (dupli as zutiKrug).pozicijaUKuci);
                        (dupli as zutiKrug).pozicija = -1;
                        (dupli as zutiKrug).aktivan = false;
                        (dupli as zutiKrug)._upravljanje.postaviStanje(new Cekaj());
                        (dupli as zutiKrug).prosaoPola = false;
                        app.zuti.dodajPiuna(ref dupli);
                    }


                }



                Grid.SetColumn(o, obicnaPolja[x]);
                Grid.SetRow(o, obicnaPolja[y]);
            }), DispatcherPriority.Background);

        }

        public void postaviSljedeciLabelu(string s)
        {
            Dispatcher.BeginInvoke(new Action(() =>
            {
                naRedu.Content = s;
                naRedu.FontSize = 30;
            }), DispatcherPriority.Background);

        }

        public void staviNaKrajnje(UserControl o, int i) // nije bas najbolje
        {
            mreza.Children.Add(o);
            Grid.SetColumn(o, krajnjaPolja[2 * (i - 1)]);
            Grid.SetRow(o, krajnjaPolja[2 * i - 1]);
        }

        public void staviNaPocetno(object o, int i) // i = 0,1,2,3
        {

            int pom = 0;
            if (o is zeleniKrug) pom = 0;
            else if (o is crveniKrug) pom = 1;
            else if (o is plaviKrug) pom = 2;
            else pom = 3;
            if (mreza.Children.Contains(o as UserControl) == false)
                mreza.Children.Add(o as UserControl);
            Grid.SetColumn(o as UserControl, pocetnaPolja[pom * 8 + 2 * i]);
            Grid.SetRow(o as UserControl, pocetnaPolja[pom * 8 + 2 * i + 1]);
        }

        public void staviUIgru(object o) // i = 0,1,2,3
        {

            Dispatcher.BeginInvoke(new Action(() =>
            {

                int pom = 0;
                if (o is zeleniKrug)
                {
                    
                    pom = 0;
                    staviNaObicnoPolje(o as UserControl, pom);
                }
                else if (o is crveniKrug)
                {
                    pom = 10;
                    staviNaObicnoPolje(o as UserControl, pom);
                }
                else if (o is plaviKrug)
                {
                    pom = 20;
                    staviNaObicnoPolje(o as UserControl, pom);
                }
                else
                {
                    pom = 30;
                    staviNaObicnoPolje(o as UserControl, pom);
                }

               



            }), DispatcherPriority.Background);
        }

        private void iscrtajPolja()
        {
            //u smjeru kazaljke na satu

            bijeliKrugovi = new List<bijeliKrug>();
            for (int i = 0; i < 40; i++)
            {
                bijeliKrugovi.Add(new bijeliKrug());
            }

            int pom = 0;
            for (int i = 0; i < 40; i++)
            {
                mreza.Children.Add(bijeliKrugovi[i]);
                Grid.SetColumn(bijeliKrugovi[i], obicnaPolja[pom]);
                pom++;
                Grid.SetRow(bijeliKrugovi[i], obicnaPolja[pom]);
                pom++;
            }
            /////////////////////////////////


            for (int i = 0; i < 16; i++)
            {
                bijeliKrugovi.Add(new bijeliKrug());
            }

            pom = 0;
            for (int i = 0; i < 16; i++)
            {
                mreza.Children.Add(bijeliKrugovi[40 + i]);
                Grid.SetColumn(bijeliKrugovi[40 + i], krajnjaPolja[pom]); // 0 1 1 2
                pom++;
                Grid.SetRow(bijeliKrugovi[40 + i], krajnjaPolja[pom]);
                pom++;

            }
            //////////////////////////
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            Aplikacija.gotovo = true;
        }

        private void Button_Click_1(object sender, RoutedEventArgs e)
        {
            if (app != null)
            {
                System.Diagnostics.Process.Start(Application.ResourceAssembly.Location);
                Application.Current.Shutdown();
            }
            postaviSljedeciLabelu("ZELENI");
            app = Aplikacija.dajInstancu(this);
            startButton.Content = "Stop";
        }



        internal void staviUKucu(UserControl o, int i)
        {
            Dispatcher.BeginInvoke(new Action(() =>
            {
                if (i > 3) return;
                int pom = 0;
                if (o is zeleniKrug)
                {
                    pom = 0;

                }
                else if (o is crveniKrug) pom = 8;
                else if (o is plaviKrug) pom = 16;
                else pom = 24;

                int x = pom + 2 * i;
                int y = pom + 1 + 2 * i;

                if (mreza.Children.Cast<UIElement>().Count(e => Grid.GetRow(e) == krajnjaPolja[y] && Grid.GetColumn(e) == krajnjaPolja[x]) == 1)
                {

                    Grid.SetColumn(o as UserControl, krajnjaPolja[x]);
                    Grid.SetRow(o as UserControl, krajnjaPolja[y]);
                    bool gotovo = true;
                    for (int j = pom; j < pom + 8; j += 2)
                    {
                        if (mreza.Children.Cast<UIElement>().Count(e => Grid.GetRow(e) == krajnjaPolja[j + 1] && Grid.GetColumn(e) == krajnjaPolja[j]) == 1)
                            gotovo = false;
                    }
                    if (gotovo)
                    {
                        Aplikacija.gotovo = true;
                        global::System.Windows.MessageBox.Show("Gotovo");
                    }
                }
                else
                {
                    global::System.Windows.MessageBox.Show((mreza.Children.Cast<UIElement>().Count(e => Grid.GetRow(e) == y && Grid.GetColumn(e) == x)).ToString());
                }

            }), DispatcherPriority.Background);
        }

        bool ponovo = false;
        bool pocela = false;


        private void Button_Click_2(object sender, RoutedEventArgs e) // BACAJ KOCKU
        {
            if (app == null)
            {
                global::System.Windows.MessageBox.Show("Pokrenite igru");
                return;
            }
            bacajButton.IsEnabled = false;

            Igrac.odigrao = false;
                Random r = new Random();
                int sBroj = r.Next() % 6 + 1;
                Igrac.noviBrojPomjeranja = sBroj;
                bool obnovi = false;

                 if (sBroj != 6 && Igrac.brojPomjeranja != 6)
                    obnovi = true;
                 int ing = Igrac.brojPomjeranja;
                osvjeziBroj(Igrac.noviBrojPomjeranja);
                
                if (Aplikacija.naRedu == 3)
                {
                    if (ZeleniIgrac.piunaUIgri == 0 && obnovi) bacajButton.IsEnabled = true;
                    if (Igrac.brojPomjeranja != 6 && ponovo != true)
                    {
                        
                        Aplikacija.naRedu = 0;
                        postaviSljedeciLabelu("ZELENI");
                        ponovo = false;
                    }
                    else if (Igrac.brojPomjeranja == 6) ponovo = true;
                    else 
                    {
                        ponovo = false;
                        Aplikacija.naRedu = 0;
                        
                       
                     }

                }
                else if (Aplikacija.naRedu == 0)
                {
                    if (CrveniIgrac.piunaUIgri == 0 && obnovi) bacajButton.IsEnabled = true;
                    if (!pocela)
                    { 
                        pocela = true;
                        if (obnovi) bacajButton.IsEnabled = true;
                    }
                    else if (Igrac.brojPomjeranja != 6 && ponovo != true)
                    {
                        
                        Aplikacija.naRedu = 1;
                        postaviSljedeciLabelu("CRVENI");
                        
                    }
                    else if (Igrac.brojPomjeranja == 6) ponovo = true;
                    else
                    {
                       ponovo = false;
                        Aplikacija.naRedu = 1;
                         
                    }

                }
                else if (Aplikacija.naRedu == 1)
                {
                    if (PlaviIgrac.piunaUIgri == 0 && obnovi) bacajButton.IsEnabled = true;
                        
                    if (Igrac.brojPomjeranja != 6 && ponovo != true)
                    {
                        Aplikacija.naRedu = 2;
                        postaviSljedeciLabelu("PLAVI");
                    }
                    else if (Igrac.brojPomjeranja == 6) ponovo = true;

                    else
                    {
                        ponovo = false;
                        Aplikacija.naRedu = 2;
                         
                    }

                }
                else if (Aplikacija.naRedu == 2)
                {
                    if (ZutiIgrac.piunaUIgri == 0 && obnovi) bacajButton.IsEnabled = true;
                        
                    if (Igrac.brojPomjeranja != 6 && ponovo != true)
                    {
                        Aplikacija.naRedu = 3;
                        postaviSljedeciLabelu("ZUTI");
                    }
                    else if (Igrac.brojPomjeranja == 6) ponovo = true;
                    else
                    {
                        ponovo = false;
                        Aplikacija.naRedu = 3;
                       
                    }

                }
                Igrac.brojPomjeranja = Igrac.noviBrojPomjeranja;
           

        }




        internal void postaviDugme(bool v)
        {
            bacajButton.IsEnabled = v;
        }

        private void Button_Click_3(object sender, RoutedEventArgs e)
        {
            Covjece.Help h = new Covjece.Help();
            h.Show();
        }

     
    }
}
